﻿//-----------------------------------------------------------------------------
// File: ScrollBar.cs
//
// Copyright (c) Dmitry Shuklin. All rights reserved.
//-----------------------------------------------------------------------------
using System;
using System.Text;
using System.ComponentModel;
using System.Drawing.Design;

namespace Cerebrum.Direct3D.Forms
{
	public class ScrollBar : Cerebrum.Direct3D.Forms.Control
	{
		protected internal static readonly object ValueChangedEvent = new object();
		protected internal static readonly object ScrollEvent = new object();

		//public event System.EventHandler ValueChanged;
		//public event System.Windows.Forms.ScrollEventHandler Scroll;

		#region Переменные
		private Cerebrum.Direct3D.Forms.Control m_Crawler;
		private float m_Offset;
		private float m_MinVal;
		private float m_MaxVal;
		private float m_CurVal;
		private float m_SmallChange;
		private float m_LargeChange;
		private bool m_MouseDownInCrawler;
		private ScrollingMethodEnum m_ScrollingMethod;
		private bool m_SizableCrawler;
		private float m_MinimumCrawlerLength;
		private Cerebrum.Direct3D.Forms.LayoutDirection m_Direction;
		#endregion

	
		#region Конструкторы
		public ScrollBar()
		{
			float scrollBarWidth; // Ширина ScrollBar-а.

			// Начальные значения свойств.
			m_MinimumCrawlerLength = 10;
			m_SizableCrawler = false;
			m_Crawler = null;
			m_ScrollingMethod = ScrollingMethodEnum.Extended;
			m_MouseDownInCrawler = false;
			m_CurVal = 0;
			m_MinVal = 0;
			m_MaxVal = 100;
			m_SmallChange = 1;
			m_LargeChange = 10;
			m_Direction = LayoutDirection.Vertical;
			scrollBarWidth = 16;
			// Настройки ScrollBar-а.
			if (this.m_Direction == LayoutDirection.Vertical)
			{
				this.Size = new System.Drawing.SizeF(scrollBarWidth, 300);
			}
			else
			{
				this.Size = new System.Drawing.SizeF(300, scrollBarWidth);
			}
			// Создаём обработчики событий.
		}
		#endregion

		/// <summary>
		/// Геттер и сеттер для события ValueChanged. 
		/// Срабатывает при liteVScrolBar1.ValueChanged += new EventHandler(liteVScrolBar1_ValueChanged);
		/// </summary>
		public event System.EventHandler ValueChanged
		{
			add { this.m_Events.AddHandler(ValueChangedEvent, value); }
			remove { this.m_Events.RemoveHandler(ValueChangedEvent, value); }
		}

		/// <summary>
		/// Геттер и сеттер для события Scroll. 
		/// Срабатывает при liteVScrolBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(liteVScrolBar1_Scroll);
		/// </summary>
		public event System.Windows.Forms.ScrollEventHandler Scroll
		{
			add { this.m_Events.AddHandler(ScrollEvent, value); }
			remove { this.m_Events.RemoveHandler(ScrollEvent, value); }
		}

		#region Обработчики событий
		/// <summary>
		/// Изменение размеров окна элемента управления ScrollBar.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected internal override void OnResize(EventArgs e)
		{
			base.OnResize(e);

			float v;

			if (m_Crawler != null)
			{
				if (this.m_Direction == LayoutDirection.Vertical)
				{
					// Изменяем размер ползунка.
					m_Crawler.Size = new System.Drawing.SizeF(this.Size.Width, CrawlerLenght());
					// Контролируем границы передвижения ползунка по ScrollBar-у
					v = BordersControl(CrawlerPosition(m_CurVal));
					// Позиция ползунка.
					m_Crawler.Location = new System.Drawing.PointF(m_Crawler.Location.X, v);
				}
				else
				{
					// Изменяем размер ползунка.
					m_Crawler.Size = new System.Drawing.SizeF(CrawlerLenght(), this.Size.Height);
					// Контролируем границы передвижения ползунка по ScrollBar-у
					v = BordersControl(CrawlerPosition(m_CurVal));
					// Позиция ползунка.
					m_Crawler.Location = new System.Drawing.PointF(v, m_Crawler.Location.Y);
				}
			}
		}

		/// <summary>
		/// Отпускание кнопки на мышке.
		/// </summary>
		protected internal override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
		{
			base.OnMouseUp(e);

			float v;

			if (m_Crawler != null)
			{
				if (this.m_Direction == LayoutDirection.Vertical)
				{
					// Отпускаем ползунок.
					m_MouseDownInCrawler = false;
					// Если положение курсора мышки находится над ползунком...
					if ((m_Crawler.Location.Y <= e.Y) && ((m_Crawler.Location.Y + m_Crawler.Size.Height) >= e.Y))
					{
						v = CrawlerPosition(m_CurVal);
						// Контролируем границы передвижения ползунка по ScrollBar-у
						v = BordersControl(v);
						// Позиция ползунка.
						m_Crawler.Location = new System.Drawing.PointF(m_Crawler.Location.X, v);
						// Посылаем событие.
						System.Windows.Forms.ScrollEventHandler hScroll = (System.Windows.Forms.ScrollEventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ScrollEvent];
						if (hScroll != null)
						{
							hScroll(this, new System.Windows.Forms.ScrollEventArgs(System.Windows.Forms.ScrollEventType.EndScroll, (int)this.Value));
						}
					}
				}
				else
				{
					// Отпускаем ползунок.
					m_MouseDownInCrawler = false;
					// Если положение курсора мышки находится над ползунком...
					if ((m_Crawler.Location.X <= e.X) && ((m_Crawler.Location.X + m_Crawler.Size.Width) >= e.X))
					{
						v = CrawlerPosition(m_CurVal);
						// Контролируем границы передвижения ползунка по ScrollBar-у
						v = BordersControl(v);
						// Позиция ползунка.
						m_Crawler.Location = new System.Drawing.PointF(v, m_Crawler.Location.Y);
						// Посылаем событие.
						System.Windows.Forms.ScrollEventHandler hScroll = (System.Windows.Forms.ScrollEventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ScrollEvent];
						if (hScroll != null)
						{
							hScroll(this, new System.Windows.Forms.ScrollEventArgs(System.Windows.Forms.ScrollEventType.EndScroll, (int)this.Value));
						}
					}
				}
			}
		}

		/// <summary>
		/// Нажатие кнопки на мышке.
		/// </summary>
		protected internal override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
		{
			base.OnMouseDown(e);

			if (m_Crawler != null)
			{
				if (this.m_Direction == LayoutDirection.Vertical)
				{
					// Вычисляем смещение от курсора мышки к началу ползунка по координате v.
					m_Offset = e.Y - m_Crawler.Location.Y;
					// Если положение курсора мышки находится над ползунком...
					if ((m_Crawler.Location.Y <= e.Y) && ((m_Crawler.Location.Y + m_Crawler.Size.Height) >= e.Y))
					{
						// Захватываем ползунок для перемещения.
						m_MouseDownInCrawler = true;
						// Посылаем событие.
						System.Windows.Forms.ScrollEventHandler hScroll = (System.Windows.Forms.ScrollEventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ScrollEvent];
						if (hScroll != null)
						{
							hScroll(this, new System.Windows.Forms.ScrollEventArgs(System.Windows.Forms.ScrollEventType.ThumbTrack, (int)this.Value));
						}
					}
					else if (m_Crawler.Location.Y > e.Y)
					{
						// Перейти на страницу вверх.
						ButtonClick(ScrollBarButtons.LargeDecrement);
					}
					else if ((m_Crawler.Location.Y + m_Crawler.Size.Height) < e.Y)
					{
						// Перейти на страницу вниз.
						ButtonClick(ScrollBarButtons.LargeIncrement);
					}
				}
				else
				{
					// Вычисляем смещение от курсора мышки к началу ползунка по координате X.
					m_Offset = e.X - m_Crawler.Location.X;
					// Если положение курсора мышки находится над ползунком...
					if ((m_Crawler.Location.X <= e.X) && ((m_Crawler.Location.X + m_Crawler.Size.Width) >= e.X))
					{
						// Захватываем ползунок для перемещения.
						m_MouseDownInCrawler = true;
						// Посылаем событие.
						System.Windows.Forms.ScrollEventHandler hScroll = (System.Windows.Forms.ScrollEventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ScrollEvent];
						if (hScroll != null)
						{
							hScroll(this, new System.Windows.Forms.ScrollEventArgs(System.Windows.Forms.ScrollEventType.ThumbTrack, (int)this.Value));
						}
					}
					else if (m_Crawler.Location.X > e.X)
					{
						// Перейти на страницу вверх.
						ButtonClick(ScrollBarButtons.LargeDecrement);
					}
					else if ((m_Crawler.Location.X + m_Crawler.Size.Width) < e.X)
					{
						// Перейти на страницу вниз.
						ButtonClick(ScrollBarButtons.LargeIncrement);
					}
				}
			}
		}

		/// <summary>
		/// Передвижение мыши по ScrollBar-у.
		/// </summary>
		protected internal override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
		{
			base.OnMouseMove(e);

			float v;

			if (m_Crawler != null)
			{
				// Если при передвижении мыши была нажата левая кнопка мыши...
				if (e.Button == System.Windows.Forms.MouseButtons.Left)
				{
					if (m_MouseDownInCrawler == true)
					{
						if (this.m_Direction == LayoutDirection.Vertical)
						{
							// Контролируем границы передвижения ползунка по ScrollBar-у
							v = BordersControl(e.Y - m_Offset);
							// Перемещаем ползунок.
							m_Crawler.Location = new System.Drawing.PointF(0, v);
						}
						else
						{
							// Контролируем границы передвижения ползунка по ScrollBar-у
							v = BordersControl(e.X - m_Offset);
							// Перемещаем ползунок.
							m_Crawler.Location = new System.Drawing.PointF(v, 0);
						}
						// Перерисовываем ScrollBar.
						this.Invalidate();
						// Вычисляется текущая позиция ползунка.
						m_CurVal = CrawlerValue(v);
						// Посылаем события.
						System.Windows.Forms.ScrollEventHandler hScroll = (System.Windows.Forms.ScrollEventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ScrollEvent];
						if (hScroll != null)
						{
							hScroll(this, new System.Windows.Forms.ScrollEventArgs(System.Windows.Forms.ScrollEventType.ThumbPosition, (int)this.Value));
						}

						System.EventHandler hValueChanged = (System.EventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ValueChangedEvent];
						if (hValueChanged != null)
						{
							hValueChanged(this, new System.EventArgs());
						}
					}
				}
			}
		}
		#endregion

		#region Приватные функции
		/// <summary>
		/// Контроль границ передвижения ползунка по ScrollBar-у.
		/// </summary>
		/// <param name="y">Предполагаемое передвижение на эту координату.</param>
		/// <returns>Фактическое передвижение.</returns>
		private float BordersControl(float v)
		{
			if (this.m_Direction == LayoutDirection.Vertical)
			{
				if (m_Crawler != null)
				{
					if (v < 0)
					{
						v = 0;
					}
					else if (v > this.Size.Height - m_Crawler.Size.Height)
					{
						v = this.Size.Height - m_Crawler.Size.Height;
					}
				}
			}
			else
			{
				if (m_Crawler != null)
				{
					if (v < 0)
					{
						v = 0;
					}
					else if (v > this.Size.Width - m_Crawler.Size.Width)
					{
						v = this.Size.Width - m_Crawler.Size.Width;
					}
				}
			}
			return v;
		}

		/// <summary>
		/// Вычисляет длину ползунка.
		/// </summary>
		/// <returns>Длина ползунка.</returns>
		private float CrawlerLenght()
		{
			float res = 0;

			if (this.m_Direction == LayoutDirection.Vertical)
			{
				if (m_SizableCrawler == true)
				{
					if ((m_ScrollingMethod == ScrollingMethodEnum.Extended) || (m_ScrollingMethod == ScrollingMethodEnum.Standard))
					{
						res = this.Size.Height * m_LargeChange / (m_MaxVal - m_MinVal);
					}
					else if (m_ScrollingMethod == ScrollingMethodEnum.FullScale)
					{
						res = this.Size.Height * m_LargeChange / (m_MaxVal - m_MinVal + m_LargeChange);
					}
					if (res < m_MinimumCrawlerLength)
					{
						res = m_MinimumCrawlerLength;
					}
				}
				else
				{
					res = m_MinimumCrawlerLength;
				}
			}
			else
			{
				if (m_SizableCrawler == true)
				{
					if ((m_ScrollingMethod == ScrollingMethodEnum.Extended) || (m_ScrollingMethod == ScrollingMethodEnum.Standard))
					{
						res = this.Size.Width * m_LargeChange / (m_MaxVal - m_MinVal);
					}
					else if (m_ScrollingMethod == ScrollingMethodEnum.FullScale)
					{
						res = this.Size.Width * m_LargeChange / (m_MaxVal - m_MinVal + m_LargeChange);
					}
					if (res < m_MinimumCrawlerLength)
					{
						res = m_MinimumCrawlerLength;
					}
				}
				else
				{
					res = m_MinimumCrawlerLength;
				}
			}
			return res;
		}

		/// <summary>
		/// Вычисляется позиция ползунка по значению.
		/// </summary>
		/// <param name="val"></param>
		/// <returns></returns>
		private float CrawlerPosition(float val)
		{
			float res = 0;

			if (this.m_Direction == LayoutDirection.Vertical)
			{
				if ((m_ScrollingMethod == ScrollingMethodEnum.Extended) || (m_ScrollingMethod == ScrollingMethodEnum.Standard))
				{
					res = (this.Size.Height - CrawlerLenght()) * (val - m_MinVal) / (m_MaxVal - m_MinVal - m_LargeChange + 1);
				}
				else if (m_ScrollingMethod == ScrollingMethodEnum.FullScale)
				{
					res = (this.Size.Height - CrawlerLenght()) * (val - m_MinVal) / (m_MaxVal - m_MinVal);
				}
			}
			else
			{
				if ((m_ScrollingMethod == ScrollingMethodEnum.Extended) || (m_ScrollingMethod == ScrollingMethodEnum.Standard))
				{
					res = (this.Size.Width - CrawlerLenght()) * (val - m_MinVal) / (m_MaxVal - m_MinVal - m_LargeChange + 1);
				}
				else if (m_ScrollingMethod == ScrollingMethodEnum.FullScale)
				{
					res = (this.Size.Width - CrawlerLenght()) * (val - m_MinVal) / (m_MaxVal - m_MinVal);
				}
			}
			return res;
		}

		/// <summary>
		/// Возвращает значение Value по позиции ползунка.
		/// </summary>
		/// <param name="pos"></param>
		/// <returns></returns>
		private float CrawlerValue(float pos)
		{
			float res = 0;
			if (this.m_Direction == LayoutDirection.Vertical)
			{
				if ((m_ScrollingMethod == ScrollingMethodEnum.Extended) || (m_ScrollingMethod == ScrollingMethodEnum.Standard))
				{
					res = pos * (m_MaxVal - m_MinVal - m_LargeChange + 1) / (this.Size.Height - CrawlerLenght()) + m_MinVal;
				}
				else if (m_ScrollingMethod == ScrollingMethodEnum.FullScale)
				{
					res = pos * (m_MaxVal - m_MinVal) / (this.Size.Height - CrawlerLenght()) + m_MinVal;
				}
			}
			else
			{
				if ((m_ScrollingMethod == ScrollingMethodEnum.Extended) || (m_ScrollingMethod == ScrollingMethodEnum.Standard))
				{
					res = pos * (m_MaxVal - m_MinVal - m_LargeChange + 1) / (this.Size.Width - CrawlerLenght()) + m_MinVal;
				}
				else if (m_ScrollingMethod == ScrollingMethodEnum.FullScale)
				{
					res = pos * (m_MaxVal - m_MinVal) / (this.Size.Width - CrawlerLenght()) + m_MinVal;
				}
			}
			return res;
		}
		#endregion

		#region Интерфейс
		/// <summary>
		/// Нажатие кнопки.
		/// </summary>
		/// <param name="btn">Какая кнопка нажимается.</param>
		public void ButtonClick(ScrollBarButtons btn)
		{
			float v;
			System.Windows.Forms.ScrollEventHandler hScroll;
			System.EventHandler hValueChanged;

			if (m_Crawler != null)
			{
				System.Windows.Forms.ScrollEventType st = System.Windows.Forms.ScrollEventType.ThumbPosition;

				// Какая кнопка нажимается.
				if (btn == ScrollBarButtons.SmallDecrement)
				{
					m_CurVal -= m_SmallChange;
					st = System.Windows.Forms.ScrollEventType.SmallDecrement;
				}
				else if (btn == ScrollBarButtons.SmallIncrement)
				{
					m_CurVal += m_SmallChange;
					st = System.Windows.Forms.ScrollEventType.SmallIncrement;
				}
				else if (btn == ScrollBarButtons.LargeDecrement)
				{
					m_CurVal -= m_LargeChange;
					st = System.Windows.Forms.ScrollEventType.LargeDecrement;
				}
				else if (btn == ScrollBarButtons.LargeIncrement)
				{
					m_CurVal += m_LargeChange;
					st = System.Windows.Forms.ScrollEventType.LargeIncrement;
				}
				if (m_CurVal < m_MinVal)
				{
					m_CurVal = m_MinVal;
				}
				if (m_ScrollingMethod == ScrollingMethodEnum.Standard)
				{
					if (m_CurVal > m_MaxVal - m_LargeChange + 1)
					{
						m_CurVal = m_MaxVal - m_LargeChange + 1;
					}
				}
				else
				{
					if (m_CurVal > m_MaxVal)
					{
						m_CurVal = m_MaxVal;
					}
				}
				v = CrawlerPosition(m_CurVal);
				// Контролируем границы передвижения ползунка по ScrollBar-у
				v = BordersControl(v);
				if (this.m_Direction == LayoutDirection.Vertical)
				{
					// Позиция ползунка.
					m_Crawler.Location = new System.Drawing.PointF(m_Crawler.Location.X, v);
				}
				else
				{
					// Позиция ползунка.
					m_Crawler.Location = new System.Drawing.PointF(v, m_Crawler.Location.Y);
				}
				// Перерисовываем ScrollBar.
				this.Invalidate();
				// Посылаем события.
				hScroll = (System.Windows.Forms.ScrollEventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ScrollEvent];
				if (hScroll != null)
				{
					hScroll(this, new System.Windows.Forms.ScrollEventArgs(st, (int)this.Value));
				}
				//if (Scroll != null)
				//{
				//    //ea.NewValue = curVal;
				//    Scroll(this, ea);
				//}
				hValueChanged = (System.EventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ValueChangedEvent];
				if (hValueChanged != null)
				{
					hValueChanged(this, new System.EventArgs());
				}

				hScroll = (System.Windows.Forms.ScrollEventHandler)this.m_Events[Cerebrum.Direct3D.Forms.ScrollBar.ScrollEvent];
				if (hScroll != null)
				{
					hScroll(this, new System.Windows.Forms.ScrollEventArgs(System.Windows.Forms.ScrollEventType.EndScroll, (int)this.Value));
				}
			}
		}

		/// <summary>
		/// Начальное значение шкалы.
		/// </summary>
		[
		Category("ScrollBar Settings"),
		DefaultValue(0),
		Description("Начальное значение шкалы")
		]
		public float Minimum
		{
			set
			{
				m_MinVal = value;
				RefreshCrawlerSize();
			}
			get
			{
				return m_MinVal;
			}
		}

		/// <summary>
		/// Конечное значение шкалы.
		/// </summary>
		[
		Category("ScrollBar Settings"),
		DefaultValue(1000),
		Description("Конечное значение шкалы")
		]
		public float Maximum
		{
			set
			{
				m_MaxVal = value;
				RefreshCrawlerSize();
			}
			get
			{
				return m_MaxVal;
			}
		}

		/// <summary>
		/// Минимальное перемещение ползунка.
		/// </summary>
		[
		Category("ScrollBar Settings"),
		DefaultValue(10),
		Description("Минимальное перемещение ползунка")
		]
		public float SmallChange
		{
			set
			{
				m_SmallChange = value;
				RefreshCrawlerSize();
			}
			get
			{
				return m_SmallChange;
			}
		}

		/// <summary>
		/// Максимальное перемещение ползунка.
		/// </summary>
		[
		Category("ScrollBar Settings"),
		DefaultValue(100),
		Description("Максимальное перемещение ползунка")
		]
		public float LargeChange
		{
			set
			{
				m_LargeChange = value;
				RefreshCrawlerSize();
			}
			get
			{
				return m_LargeChange;
			}
		}

		/// <summary>
		/// Значение (позиция).
		/// </summary>
		[
		Category("ScrollBar Settings"),
		DefaultValue(0),
		Description("Значение (позиция)")
		]
		public float Value
		{
			set
			{
				m_CurVal = value;
				RefreshCrawlerSize();
			}
			get
			{
				return m_CurVal;
			}
		}

		/// <summary>
		/// Вариант возвращения значения в свойстве Value
		/// </summary>
		[
		Category("ScrollBar Settings"),
		DefaultValue(0),
		Description("Вариант возвращения значения в свойстве Value")
		]
		public Cerebrum.Direct3D.Forms.ScrollingMethodEnum ScrollingMethod
		{
			set
			{
				m_ScrollingMethod = value;
				RefreshCrawlerSize();
			}
			get
			{
				return m_ScrollingMethod;
			}
		}

		/// <summary>
		/// Длина прокрутки ползунка.
		/// </summary>
		[
		Category("ScrollBar info"),
		Description("Длина прокрутки ползунка")
		]
		public float ScrollBarPathLength
		{
			get
			{
				return this.Size.Height;
			}
		}

		/// <summary>
		/// Длина ползунка.
		/// </summary>
		[
		Category("ScrollBar info"),
		Description("Длина ползунка")
		]
		public float MinimumCrawlerLength
		{
			set
			{
				m_MinimumCrawlerLength = value;
				RefreshCrawlerSize();
			}
			get
			{
				return m_MinimumCrawlerLength;
			}
		}
		public float CurrentCrawlerLength
		{
			get
			{
				return this.CrawlerLenght();
			}
		}

		/// <summary>
		/// Элемент управления - ползунок.
		/// </summary>
		[
		Category("ScrollBar info"),
		Description("Элемент управления - ползунок")
		]
		public Cerebrum.Direct3D.Forms.Control CrawlerControl
		{
			set
			{
				// Если добавляемый элемент управления не тот же что и существующий...
				if (m_Crawler != value)
				{
					// Если добавляемого элемента управления нет в коллекции элементов управления...
					if (this.Controls.Contains(value) == false)
					{
						if (m_Crawler == null)
						{
							// Сохраняем в переменной m_Crawler новый ползунок.
							m_Crawler = value;
							RefreshCrawlerSize();
						}
						else
						{
							// Если старый элемент управления присутствует в коллекции...
							if (this.Controls.Contains(m_Crawler) == true)
							{
								// Сохраняем размер ползунка.
								value.Size = m_Crawler.Size;
								// Сохраняем положение ползунка.
								value.Location = m_Crawler.Location;
								// Удаляем ползунок из коллекции элементов управления 
								this.Controls.Remove(m_Crawler);
								// Сохраняем в переменной m_Crawler новый ползунок.
								m_Crawler = value;
							}
							else
							{
								// Сохраняем в переменной m_Crawler новый ползунок.
								m_Crawler = value;
								RefreshCrawlerSize();
							}
						}
						// Ползунок прозрачен для событий мышки.
						m_Crawler.Transparent = true;
						// Добавляем ползунок в коллекцию элементов управления.
						this.Controls.Add(m_Crawler);
					}
				}
			}
			get
			{
				return m_Crawler;
			}
		}

		/// <summary>
		/// Фиксированный размер ползунка или изменяется пропорционально документа.
		/// </summary>
		[
		Category("ScrollBar Settings"),
		DefaultValue(false),
		Description("Фиксированный размер ползунка или изменяется пропорционально документа")
		]
		public bool SizableCrawler
		{
			set
			{
				m_SizableCrawler = value;
				RefreshCrawlerSize();
			}
			get
			{
				return m_SizableCrawler;
			}
		}

		public Cerebrum.Direct3D.Forms.LayoutDirection Direction
		{
			get { return m_Direction; }
			set { m_Direction = value; }
		}
		#endregion

		private void RefreshCrawlerSize()
		{
			float v;
			if (m_Crawler != null)
			{
				if (this.m_Direction == LayoutDirection.Vertical)
				{
					// Изменяем размер ползунка.
					m_Crawler.Size = new System.Drawing.SizeF(this.Size.Width, CrawlerLenght());
					// Контролируем границы передвижения ползунка по ScrollBar-у
					v = BordersControl(CrawlerPosition(m_CurVal));
					// Позиция ползунка.
					m_Crawler.Location = new System.Drawing.PointF(m_Crawler.Location.X, v);
				}
				else
				{
					// Изменяем размер ползунка.
					m_Crawler.Size = new System.Drawing.SizeF(CrawlerLenght(), this.Size.Height);
					// Контролируем границы передвижения ползунка по ScrollBar-у
					v = BordersControl(CrawlerPosition(m_CurVal));
					// Позиция ползунка.
					m_Crawler.Location = new System.Drawing.PointF(v, m_Crawler.Location.Y);
				}
			}
		}
	}
}
